package com.sheng.leetcode.year2022.month06.day07;

import org.junit.Test;

/**
 * @author liusheng
 * @date 2022/06/07
 *
 * 875. 爱吃香蕉的珂珂
 *
 * 珂珂喜欢吃香蕉。这里有 n 堆香蕉，第 i 堆中有 piles[i] 根香蕉。警卫已经离开了，将在 h 小时后回来。
 * 珂珂可以决定她吃香蕉的速度 k （单位：根/小时）。每个小时，她将会选择一堆香蕉，
 * 从中吃掉 k 根。如果这堆香蕉少于 k 根，她将吃掉这堆的所有香蕉，然后这一小时内不会再吃更多的香蕉。  
 * 珂珂喜欢慢慢吃，但仍然想在警卫回来前吃掉所有的香蕉。
 * 返回她可以在 h 小时内吃掉所有香蕉的最小速度 k（k 为整数）。
 *
 * 示例 1：
 *
 * 输入：piles = [3,6,7,11], h = 8
 * 输出：4
 * 示例 2：
 *
 * 输入：piles = [30,11,23,4,20], h = 5
 * 输出：30
 * 示例 3：
 *
 * 输入：piles = [30,11,23,4,20], h = 6
 * 输出：23
 *
 * 提示：
 *
 * 1 <= piles.length <= 10^4
 * piles.length <= h <= 10^9
 * 1 <= piles[i] <= 10^9
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/koko-eating-bananas
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class LeetCode0875 {

    @Test
    public void test01(){
//        int[] piles = {3,6,7,11};
//        int h = 8;
//        int[] piles = {30,11,23,4,20};
//        int h = 5;
//        int[] piles = {30,11,23,4,20};
//        int h = 6;
        int[] piles = {30,11,23,4,20};
        int h = 6;
        System.out.println(new Solution().minEatingSpeed(piles, h));
    }
}
class Solution {
    public int minEatingSpeed(int[] piles, int h) {
        //二分查找，最后获取左边界点即为满足条件的最小值
        int left = 1;
        int right = 1000000000;
        while (left < right) {
            int num = left + (right - left) / 2;
            if (success(piles, num, h)) {
                right = num;
            } else {
                left = num + 1;
            }
        }
        return left;
    }

    public boolean success(int[] piles, int k, int h) {
        //true为以k速度吃香蕉能吃完，false为不能吃完
        int count = 0;
        for (int i = 0; i < piles.length; i++) {
            if (piles[i] % k == 0) {
                count += piles[i] / k;
            } else {
                count += piles[i] / k + 1;
            }
        }
        return count <= h;
    }
}
